import paramiko
from paramiko.ssh_exception import SSHException

# 服务器列表（替换为实际IP和密码）
servers = [
    {"ip": "10.130.1.124", "user": "root", "pwd": "Nesc@@000686"},
    {"ip": "10.130.1.80", "user": "root", "pwd": "Nesc@@000686"}
]

# 配置要传输和执行的脚本信息
local_script_path = "/home/nescadmin/python_code/scripts/test.sh"      # 本地脚本路径
remote_script_path = "/tmp/test.sh"  # 远程服务器上的脚本路径

# 单台服务器执行部署操作
def deploy_to_server(server):
    ssh = None
    try:
        # 1. 创建SSH客户端并连接服务器
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 自动接受未知主机密钥
        print(f"正在连接服务器: {server['ip']}")
        
        ssh.connect(
            hostname=server["ip"],
            username=server["user"],
            password=server["pwd"],
            timeout=10
        )
        
        # 2. SCP上传本地脚本到目标机器
        print(f"正在上传脚本到 {server['ip']}:{remote_script_path}")
        sftp = ssh.open_sftp()
        sftp.put(local_script_path, remote_script_path)
        sftp.close()
        
        # 3. 给远程脚本添加执行权限（chmod +x）
        print(f"正在为 {server['ip']} 上的脚本添加执行权限")
        chmod_cmd = f"chmod +x {remote_script_path}"
        stdin, stdout, stderr = ssh.exec_command(chmod_cmd)
        # 等待命令执行完成并检查错误
        chmod_error = stderr.read().decode().strip()
        if chmod_error:
            raise Exception(f"添加执行权限失败: {chmod_error}")
        
        # 4. 执行远程脚本，并获取输出
        print(f"正在在 {server['ip']} 上执行脚本")
        stdin, stdout, stderr = ssh.exec_command(remote_script_path)
        
        # 读取执行结果
        stdout_info = stdout.read().decode().strip()
        stderr_info = stderr.read().decode().strip()
        
        print(f"\n{server['ip']} 脚本执行输出:")
        print("-" * 50)
        print(stdout_info)
        
        if stderr_info:
            print(f"\n{server['ip']} 脚本执行错误:")
            print("-" * 50)
            print(stderr_info)
            
        print(f"\n{server['ip']} 操作完成")
        print("=" * 70)

    except Exception as e:
        print(f"\n{server['ip']} 操作失败: {str(e)}")
        print("=" * 70)
    finally:
        # 确保SSH连接关闭
        if ssh is not None:
            ssh.close()
            print(f"{server['ip']} SSH连接已关闭\n")

# 批量部署到所有服务器
def batch_deploy():
    print("开始批量部署脚本到所有服务器...")
    print("=" * 70)
    
    for server in servers:
        deploy_to_server(server)
    
    print("所有服务器部署操作已完成")

if __name__ == "__main__":
    batch_deploy()